/**
 * 密码强度校验工具类
 */
export default {
    // 最小密码长度
    MIN_LENGTH: 8,
    // 最大密码长度
    MAX_LENGTH: 20,
    // 包含数字的正则
    DIGIT_PATTERN: /\d/,
    // 包含小写字母的正则
    LOWERCASE_PATTERN: /[a-z]/,
    // 包含大写字母的正则
    UPPERCASE_PATTERN: /[A-Z]/,
    // 包含特殊字符的正则
    SPECIAL_CHAR_PATTERN: /[~!@#$%^&*()_+\-={}[\]|;:,.<>/?]/,
  
    /**
     * 校验密码是否符合强度要求
     * @param {string} password 待校验的密码
     * @returns {Object} 校验结果，包含校验状态和消息
     */
    validate(password) {
      if (!password || password.length === 0) {
        return { valid: false, message: '密码不能为空' };
      }
  
      // 检查密码长度
      if (password.length < this.MIN_LENGTH || password.length > this.MAX_LENGTH) {
        return { 
          valid: false, 
          message: `密码长度必须在${this.MIN_LENGTH}到${this.MAX_LENGTH}个字符之间` 
        };
      }
  
      // 检查是否包含空格
      if (password.includes(' ')) {
        return { valid: false, message: '密码不能包含空格' };
      }
  
      // 至少满足三项：数字、小写字母、大写字母、特殊字符
      let conditionsMet = 0;
  
      if (this.DIGIT_PATTERN.test(password)) {
        conditionsMet++;
      }
  
      if (this.LOWERCASE_PATTERN.test(password)) {
        conditionsMet++;
      }
  
      if (this.UPPERCASE_PATTERN.test(password)) {
        conditionsMet++;
      }
  
      if (this.SPECIAL_CHAR_PATTERN.test(password)) {
        conditionsMet++;
      }
  
      if (conditionsMet < 3) {
        return { 
          valid: false, 
          message: '密码必须包含数字、小写字母、大写字母、特殊字符中的至少三种' 
        };
      }
  
      return { valid: true, message: '密码格式正确' };
    },
  
    /**
     * 获取密码强度评分（0-100）
     * @param {string} password 密码
     * @returns {number} 密码强度分数
     */
    getStrengthScore(password) {
      if (!password || password.length === 0) return 0;
  
      let score = 0;
  
      // 基础长度分数（最大40分）
      const lengthScore = Math.min(40, (password.length / this.MAX_LENGTH) * 40);
      score += lengthScore;
  
      // 复杂度分数（每项最大15分，共60分）
      if (this.DIGIT_PATTERN.test(password)) score += 15;
      if (this.LOWERCASE_PATTERN.test(password)) score += 15;
      if (this.UPPERCASE_PATTERN.test(password)) score += 15;
      if (this.SPECIAL_CHAR_PATTERN.test(password)) score += 15;
  
      return Math.min(100, score);
    },
  
    /**
     * 获取密码强度级别描述
     * @param {number} score 密码强度分数
     * @returns {Object} 强度级别对象，包含级别和对应的类名和颜色
     */
    getStrengthLevel(score) {
      if (score < 40) {
        return { level: '弱', className: 'weak', color: '#ff4d4f' };
      } else if (score < 70) {
        return { level: '中', className: 'medium', color: '#faad14' };
      } else {
        return { level: '强', className: 'strong', color: '#52c41a' };
      }
    }
  }